Remove linked list elements¶
Time: O(N); Space: O(1); easy
Remove all elements from a linked list of integers that have value val.
Example 1:
Input: head = {ListNode} 1->2->6->3->4->5->6->None, val = 6
Output: {ListNode} 1->2->3->4->5->None
Example 2:
Input: head = {ListNode} 1->2->3->3->4->5->3->None, val = 3
Output: {ListNode} 1->2->4->5->None
Example 3:
Input: head = {ListNode} 1->1->None, val = 1
Output: None
[4]:
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
[5]:
class Solution1(object):
"""
Time: O(N)
Space: O(1)
"""
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
dummy = ListNode(float("-inf"))
dummy.next = head
prev, curr = dummy, dummy.next
while curr:
if curr.val == val:
prev.next = curr.next
else:
prev = curr
curr = curr.next
return dummy.next
[7]:
s = Solution1()
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(6)
head.next.next.next = ListNode(3)
head.next.next.next.next = ListNode(4)
head.next.next.next.next.next = ListNode(5)
head.next.next.next.next.next.next = ListNode(6)
val = 6
res = s.removeElements(head, val)
exp = [1,2,3,4,5]
for val in exp:
assert res.val == val
res = res.next
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(3)
head.next.next.next.next = ListNode(4)
head.next.next.next.next.next = ListNode(5)
head.next.next.next.next.next.next = ListNode(3)
val = 3
res = s.removeElements(head, val)
exp = [1,2,4,5]
for val in exp:
assert res.val == val
res = res.next
head = ListNode(1)
head.next = ListNode(1)
val = 1
res = s.removeElements(head, val)
assert res == None